
<!DOCTYPE HTML>
<html lang="" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>Binder · GitBook</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        
        
        
    
    <link rel="stylesheet" href="../../gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
    
        
    
        
    
        
    
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="Dialog源码.html" />
    
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="Type to search" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="../../">
            
                <a href="../../">
            
                    
                    前言
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="../">
            
                <a href="../">
            
                    
                    Android
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.1" >
            
                <span>
            
                    
                    框架
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.1.1" data-path="../框架/BlockCanary.html">
            
                <a href="../框架/BlockCanary.html">
            
                    
                    BlockCanary
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.1.2" data-path="../框架/fresco.html">
            
                <a href="../框架/fresco.html">
            
                    
                    Fresco
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.1.3" data-path="../框架/Glide源码.html">
            
                <a href="../框架/Glide源码.html">
            
                    
                    Glide
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.1.4" data-path="../框架/LeakCanary原理.html">
            
                <a href="../框架/LeakCanary原理.html">
            
                    
                    LeakCanary
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.1.5" data-path="../框架/Retrofit源码.html">
            
                <a href="../框架/Retrofit源码.html">
            
                    
                    Retrofit源码
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.2.2" >
            
                <span>
            
                    
                    源码解析
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter active" data-level="1.2.2.1" data-path="Binder.html">
            
                <a href="Binder.html">
            
                    
                    Binder
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2.2" data-path="Dialog源码.html">
            
                <a href="Dialog源码.html">
            
                    
                    Dialog源码
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2.3" data-path="RecycleView缓存机制.html">
            
                <a href="RecycleView缓存机制.html">
            
                    
                    RecycleView缓存机制
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2.4" data-path="WMS源码.html">
            
                <a href="WMS源码.html">
            
                    
                    WMS源码
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.2.3" >
            
                <span>
            
                    
                    自定义View及效果
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.3.1" data-path="../自定义View及效果/触摸事件.html">
            
                <a href="../自定义View及效果/触摸事件.html">
            
                    
                    触摸事件
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3.2" data-path="../自定义View及效果/自定义ItemDecoration.html">
            
                <a href="../自定义View及效果/自定义ItemDecoration.html">
            
                    
                    自定义ItemDecoration
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3.3" data-path="../自定义View及效果/ItemTouchHelper使用.html">
            
                <a href="../自定义View及效果/ItemTouchHelper使用.html">
            
                    
                    ItemTouchHelper
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3.4" data-path="../自定义View及效果/MaterilaDesign布局使用.html">
            
                <a href="../自定义View及效果/MaterilaDesign布局使用.html">
            
                    
                    MaterilaDesign布局使用
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.2.4" >
            
                <span>
            
                    
                    Gradle
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.4.1" data-path="../Gradle/Gradle编译流程梳理.html">
            
                <a href="../Gradle/Gradle编译流程梳理.html">
            
                    
                    Gradle编译流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.4.2" data-path="../Gradle/Transform使用.html">
            
                <a href="../Gradle/Transform使用.html">
            
                    
                    Transform使用
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.2.5" >
            
                <span>
            
                    
                    kotlin实践
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.5.1" data-path="../Kotlin/协程使用.html">
            
                <a href="../Kotlin/协程使用.html">
            
                    
                    协程初步使用
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="../../java/">
            
                <a href="../../java/">
            
                    
                    Java
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.1" data-path="../../java/多线程同步.html">
            
                <a href="../../java/多线程同步.html">
            
                    
                    多线程同步
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.2" data-path="../../java/垃圾回收机制.html">
            
                <a href="../../java/垃圾回收机制.html">
            
                    
                    垃圾回收机制
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="../../计算机网络/">
            
                <a href="../../计算机网络/">
            
                    
                    计算机网络
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.4.1" data-path="../../计算机网络/编码加密.html">
            
                <a href="../../计算机网络/编码加密.html">
            
                    
                    编码加密算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.2" data-path="../../计算机网络/登陆认证.html">
            
                <a href="../../计算机网络/登陆认证.html">
            
                    
                    登陆认证流程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.3" data-path="../../计算机网络/http协议.html">
            
                <a href="../../计算机网络/http协议.html">
            
                    
                    http协议
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="../../操作系统/">
            
                <a href="../../操作系统/">
            
                    
                    操作系统
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6" >
            
                <span>
            
                    
                    设计模式
            
                </span>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.6.1" data-path="../../设计模式/单例模式.html">
            
                <a href="../../设计模式/单例模式.html">
            
                    
                    单例模式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.2" data-path="../../设计模式/建造者模式.html">
            
                <a href="../../设计模式/建造者模式.html">
            
                    
                    建造者模式
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            Published with GitBook
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="../.." >Binder</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h3 id="binder&#x4F7F;&#x7528;aidl&#x5B9E;&#x73B0;">Binder&#x4F7F;&#x7528;AIDL&#x5B9E;&#x73B0;</h3>
<h5 id="1&#x65B0;&#x5EFA;aidl&#x5305;&#x3001;&#x65B0;&#x5EFA;&#x9700;&#x8981;&#x4F20;&#x8F93;&#x7684;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#xFF08;&#x5B9E;&#x73B0;parcelable&#xFF09;">1.&#x65B0;&#x5EFA;aidl&#x5305;&#x3001;&#x65B0;&#x5EFA;&#x9700;&#x8981;&#x4F20;&#x8F93;&#x7684;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#xFF08;&#x5B9E;&#x73B0;Parcelable&#xFF09;</h5>
<pre><code>package com.example.aidltest.aidl;
/**
* Created by joel.
* Date: 2019/6/7
* Time: 15:56
* Description:
*/
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by &#x80E1;&#x6CFD;&#x5B87; on 2019/1/21.
*/
public class Book implements Parcelable {
    public int id;
    public String name;
    public double price;
    protected Book(Parcel in) {
        id = in.readInt();
        name = in.readString();
        price = in.readDouble();
    }
    public Book (){
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //&#x5E8F;&#x5217;&#x5316;&#x8FC7;&#x7A0B;&#xFF0C;&#x5C06;&#x5C5E;&#x6027;&#x5199;&#x6210;&#x5E8F;&#x5217;
        dest.writeInt(id);
        dest.writeString(name);
        dest.writeDouble(price);
    }
    @Override
    public int describeContents() {
        return 0;
    }
    public void readFromParcel(Parcel in){
        id = in.readInt();
        name = in.readString();
        price = in.readDouble();
    }
    public static final Creator&lt;Book&gt; CREATOR = new Creator&lt;Book&gt;() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }
        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };
}
</code></pre><h5 id="2&#x5728;aidl&#x7684;&#x5305;&#x53F3;&#x952E;&#x65B0;&#x5EFA;aidl&#x63A5;&#x53E3;&#x6587;&#x4EF6;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x5B9A;&#x4E49;&#x9700;&#x8981;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x7684;&#x65B9;&#x6CD5;&#xFF08;&#x7CFB;&#x7EDF;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x4E86;&#x4E00;&#x4E2A;aidl&#x76EE;&#x5F55;&#xFF0C;&#x8FD9;&#x4E2A;&#x76EE;&#x5F55;&#x548C;aidl&#x7684;&#x5305;&#x540D;&#x4E00;&#x6837;&#xFF09;">2.&#x5728;aidl&#x7684;&#x5305;&#x53F3;&#x952E;&#x65B0;&#x5EFA;aidl&#x63A5;&#x53E3;&#x6587;&#x4EF6;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x5B9A;&#x4E49;&#x9700;&#x8981;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x7684;&#x65B9;&#x6CD5;&#xFF08;&#x7CFB;&#x7EDF;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x4E86;&#x4E00;&#x4E2A;aidl&#x76EE;&#x5F55;&#xFF0C;&#x8FD9;&#x4E2A;&#x76EE;&#x5F55;&#x548C;aidl&#x7684;&#x5305;&#x540D;&#x4E00;&#x6837;&#xFF09;</h5>
<p><strong>&#x5F15;&#x5165;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x7C7B;&#x7528;&#x4E8E;&#x4F20;&#x8F93;&#x65F6;&#xFF08;&#x5982;Book&#x7C7B;&#xFF09;&#xFF0C;&#x9700;&#x8981;&#x518D;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;Book.aidl&#x7C7B;&#x58F0;&#x660E;&#x3002;</strong></p>
<pre><code>// Book.aidl
package com.example.aidltest.aidl;
parcelable Book;
</code></pre><p>&#x7ED9;&#x8FDC;&#x7A0B;&#x63A5;&#x53E3;&#x8C03;&#x7528;&#x7684;&#x65B9;&#x6CD5;</p>
<pre><code>// IMyAidlInterface.aidl
package com.example.aidltest.aidl;
import com.example.aidltest.aidl.Book;
// Declare any non-default types here with import statements
interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
     void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
                double aDouble, String aString);
      String connect(String mes);
      void disConnect(String mes);
      Book GetBook();
      void SetBook(int id,String name,double price);
}
</code></pre><p>&#x6B64;&#x65F6;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#x5E94;&#x8BE5;&#x662F;&#x8FD9;&#x6837;&#x7684;&#xFF1A;
<img src="https://hzy-joel.github.io/img/post/post_aidl.jpg" alt="&#x76EE;&#x5F55;&#x7ED3;&#x6784;"></p>
<h5 id="3-&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;service&#x5B50;&#x7C7B;&#xFF0C;&#x7528;&#x4E8E;&#x7ED9;&#x5916;&#x754C;&#x8FDE;&#x63A5;&#x3001;&#x5728;&#x5176;&#x4E2D;&#x7684;onbind&#x65B9;&#x6CD5;&#x4E2D;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;ibinder&#x7C7B;&#xFF08;&#x8FD9;&#x4E2A;&#x7C7B;&#x5B9E;&#x4F8B;&#x662F;&#x4F7F;&#x7528;&#x4E0A;&#x9762;&#x7684;&#x63A5;&#x53E3;&#x6587;&#x4EF6;&#x7684;stub&#x65B9;&#x6CD5;&#x521B;&#x5EFA;&#x7684;&#xFF09;&#x3002;">3. &#x65B0;&#x5EFA;&#x4E00;&#x4E2A;Service&#x5B50;&#x7C7B;&#xFF0C;&#x7528;&#x4E8E;&#x7ED9;&#x5916;&#x754C;&#x8FDE;&#x63A5;&#x3001;&#x5728;&#x5176;&#x4E2D;&#x7684;onBind&#x65B9;&#x6CD5;&#x4E2D;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;IBinder&#x7C7B;&#xFF08;&#x8FD9;&#x4E2A;&#x7C7B;&#x5B9E;&#x4F8B;&#x662F;&#x4F7F;&#x7528;&#x4E0A;&#x9762;&#x7684;&#x63A5;&#x53E3;&#x6587;&#x4EF6;&#x7684;Stub&#x65B9;&#x6CD5;&#x521B;&#x5EFA;&#x7684;&#xFF09;&#x3002;</h5>
<pre><code>package com.sg.hzy.aidltest;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.sg.hzy.aidltest.aidl.Book;
import com.sg.hzy.aidltest.aidl.IMyAidlInterface;
/**
* Created by hzy on 2019/1/21.
*/
public class Bservice extends Service {
    private static final String TAG = &quot;ConnectService&quot;;
    public Bservice() {
    }
    String State=&quot;&#x6CA1;&#x6709;&#x8FDE;&#x63A5;&quot;;
    Book book=new Book();
    //&#x8FD9;&#x91CC;&#x662F;&#x6211;&#x4EEC;&#x5B9A;&#x4E49;&#x7684;&#x670D;&#x52A1;&#x5668;&#x7684;&#x5B9E;&#x4F8B;&#xFF0C;&#x5F53;&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x76F8;&#x5E94;&#x7684;&#x63A5;&#x53E3;&#x65B9;&#x6CD5;&#x65F6;&#x8C03;&#x7528;&#x7684;&#x5B9E;&#x9645;&#x662F;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x3002;
    IMyAidlInterface.Stub mIBinder=new IMyAidlInterface.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
        }
        @Override
        public String connect(String mes) throws RemoteException {
            return mes;
        }
        @Override
        public void disConnect(String mes) throws RemoteException {
            Log.i(TAG, &quot;disconnect: &quot;);
        }
        @Override
        public Book GetBook() throws RemoteException {
            return book;
        }
        @Override
        public void SetBook(int id, String name, double price) throws RemoteException {
            book.setId(id);
            book.setName(name);
            book.setPrice(price);
            Log.i(TAG, &quot;SetBook:&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x4E3A;&quot;+id + name+ price);
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
        return mIBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}
</code></pre><h5 id="4-&#x914D;&#x7F6E;service&#x5C5E;&#x6027;-androidexported&#x8BBE;&#x7F6E;&#x5141;&#x8BB8;&#x5916;&#x90E8;&#x8C03;&#x7528;&#xFF0C;androidprocessremote&#x5355;&#x72EC;&#x8FDB;&#x7A0B;&#x3002;">4. &#x914D;&#x7F6E;Service&#x5C5E;&#x6027; android:exported&#x8BBE;&#x7F6E;&#x5141;&#x8BB8;&#x5916;&#x90E8;&#x8C03;&#x7528;&#xFF0C;android:process=&quot;:remote&quot;&#x5355;&#x72EC;&#x8FDB;&#x7A0B;&#x3002;</h5>
<pre><code>&lt;service android:name=&quot;.Bservice&quot;
    android:exported=&quot;true&quot;
    android:process=&quot;:remote&quot;&gt;
    &lt;intent-filter&gt;
        &lt;action android:name=&quot;com.sg.hzy.aidltest.Bservice&quot;/&gt;
    &lt;/intent-filter&gt;
&lt;/service&gt;
</code></pre><h5 id="5-&#x5BA2;&#x6237;&#x7AEF;&#x4F7F;&#x7528;&#xFF0C;&#x5373;&#x53E6;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#x8C03;&#x7528;&#x6570;&#x636E;">5. &#x5BA2;&#x6237;&#x7AEF;&#x4F7F;&#x7528;&#xFF0C;&#x5373;&#x53E6;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#x8C03;&#x7528;&#x6570;&#x636E;</h5>
<pre><code>private IMyAidlInterface myAidlInterface;
String TAG=&quot;client&quot;;
ServiceConnection bservice = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        //&#x83B7;&#x5F97;&#x5B9E;&#x4F8B;
        myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        try {
            //&#x8C03;&#x7528;&#x63A5;&#x53E3;&#x65B9;&#x6CD5;
            myAidlInterface.SetBook(1,&quot;&#x4E66;&#x672C;&quot;,1f);
            Book book=myAidlInterface.GetBook();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.aty1);
    bindService();
}
/**
* &#x7ED1;&#x5B9A;&#x670D;&#x52A1;
*
*/
public void bindService() {
        //&#x542F;&#x52A8;Service
    Intent intent = new Intent();
    intent.setAction(&quot;com.sg.hzy.aidltest.Bservice&quot;);
    intent.setPackage(&quot;com.sg.hzy.aidltest&quot;);
    startService(intent);
    bindService(intent, bservice, BIND_AUTO_CREATE);
    Log.i(&quot;client&quot;, &quot;bindService: &#x7ED1;&#x5B9A;&#x670D;&#x52A1;&quot;);
}
</code></pre><h3 id="aidl&#x89E3;&#x6790;&#xFF1A;">AIDL&#x89E3;&#x6790;&#xFF1A;</h3>
<ol>
<li><p>&#x9996;&#x5148;AIDL&#x53EA;&#x662F;&#x5BF9;Binder&#x7684;&#x4E00;&#x79CD;&#x7B80;&#x6613;&#x5316;&#x5B9E;&#x73B0;&#xFF0C;&#x5B9E;&#x8D28;&#x662F;&#x5BF9;&#x6211;&#x4EEC;&#x7684;aidl&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x4E86;&#x89E3;&#x6790;&#x5C01;&#x88C5;&#x51FA;&#x4E00;&#x4E2A;&#x771F;&#x6B63;&#x7684;&#x63A5;&#x53E3;&#x7C7B;&#x3001;&#x8BE5;&#x7C7B;&#x5728;gen&#x4E0B;&#x7684;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x4E0B;&#x53EF;&#x4EE5;&#x627E;&#x5230;&#x3001;&#x5982;&#x4E0A;&#x9762;&#x7684;&#x5C31;&#x662F;IMyAidlInterface&#x8FD9;&#x4E2A;&#x63A5;&#x53E3;,&#x770B;&#x5230;&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x5B9E;&#x4F8B;&#x7684;&#x65B9;&#x6CD5;&#xFF1A;
&#x67E5;&#x770B;&#x751F;&#x6210;&#x7684;aidl&#x6587;&#x4EF6;</p>
<pre><code>public interface IBookManger extends android.os.IInterface
{

 //Stub&#x5185;&#x90E8;&#x7C7B;
public static abstract class Stub extends android.os.Binder implements com.example.test.aidl.IBookManger{
 //Binder&#x4FEE;&#x9970;&#x7B26;&#xFF0C;&#x552F;&#x4E00;&#x80FD;&#x786E;&#x5B9A;binder&#x7684;Id
 private static final java.lang.String DESCRIPTOR = &quot;com.example.test.aidl.IBookManger&quot;;

 public Stub()
 {
   this.attachInterface(this, DESCRIPTOR);
 }

 public static com.example.test.aidl.IBookManger asInterface(android.os.IBinder obj)
 {
   if ((obj==null)) {
     return null;
   }
   //&#x5224;&#x65AD;&#x8C03;&#x7528;&#x8005;&#x662F;&#x4E0D;&#x662F;&#x5728;&#x540C;&#x4E00;&#x8FDB;&#x7A0B;&#x662F;&#x7684;&#x8BDD;&#x5C31;&#x8FD4;&#x56DE;&#x672C;&#x5730;&#x7684;&#x63A5;&#x53E3;&#x5B9E;&#x73B0;&#x7C7B;
   android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
   if (((iin!=null)&amp;&amp;(iin instanceof com.example.test.aidl.IBookManger))) {
     return ((com.example.test.aidl.IBookManger)iin);
   }
   return new com.example.test.aidl.IBookManger.Stub.Proxy(obj);
 }
 //&#x5426;&#x5219;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x4EE3;&#x7406;&#x7C7B;
 @Override public android.os.IBinder asBinder()
 {
   return this;
 }
 @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
 {
    //&#x901A;&#x8FC7;code&#x53EF;&#x4EE5;&#x5224;&#x65AD;&#x8C03;&#x7528;&#x4E86;&#x54EA;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;data&#x4E3A;&#x8F93;&#x5165;&#x53C2;&#x6570;&#x3001;reply&#x4E3A;&#x8FD4;&#x56DE;&#x53C2;&#x6570;
   java.lang.String descriptor = DESCRIPTOR;
   switch (code)
   {
     case INTERFACE_TRANSACTION:
     {
       reply.writeString(descriptor);
       return true;
     }
     case TRANSACTION_GetBook:
     {
       data.enforceInterface(descriptor);
       com.example.test.aidl.Book _result = this.GetBook();
       reply.writeNoException();
       if ((_result!=null)) {
         reply.writeInt(1);
         _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
       }
       else {
         reply.writeInt(0);
       }
       return true;
     }
     case TRANSACTION_SetBook:
     {
       data.enforceInterface(descriptor);
       int _arg0;
       _arg0 = data.readInt();
       java.lang.String _arg1;
       _arg1 = data.readString();
       double _arg2;
       _arg2 = data.readDouble();
       this.SetBook(_arg0, _arg1, _arg2);
       reply.writeNoException();
       return true;
     }
     default:
     {
       return super.onTransact(code, data, reply, flags);
     }
   }
 }

 Proxy&#x5185;&#x90E8;&#x4EE3;&#x7406;&#x7C7B;
 private static class Proxy implements com.example.test.aidl.IBookManger
 {
   private android.os.IBinder mRemote;
   Proxy(android.os.IBinder remote)
   {
     mRemote = remote;
   }
   @Override public android.os.IBinder asBinder()
   {
     return mRemote;
   }
    //&#x5728;&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x65B9;&#x6CD5;&#x65F6;&#x5B9E;&#x9645;&#x4F1A;&#x8C03;&#x7528;&#x5230;&#x8FD9;&#x91CC;
   @Override public com.example.test.aidl.Book GetBook() throws android.os.RemoteException
   {
     //&#x5C06;&#x8C03;&#x7528;&#x53C2;&#x6570;&#x5199;&#x5165;
     android.os.Parcel _data = android.os.Parcel.obtain();
     android.os.Parcel _reply = android.os.Parcel.obtain();
     com.example.test.aidl.Book _result;
     try {
       _data.writeInterfaceToken(DESCRIPTOR);
       //&#x8C03;&#x7528;Binder&#x7684;transact&#x65B9;&#x6CD5;&#x3001;&#x8FD4;&#x56DE;true&#x4EE3;&#x8868;&#x8C03;&#x7528;&#x6210;&#x529F;
       boolean _status = mRemote.transact(Stub.TRANSACTION_GetBook, _data, _reply, 0);
       if (!_status &amp;&amp; getDefaultImpl() != null) {
         //&#x8FD4;&#x56DE;&#x7ED3;&#x679C;
         return getDefaultImpl().GetBook();
       }
       _reply.readException();
       if ((0!=_reply.readInt())) {
         _result = com.example.test.aidl.Book.CREATOR.createFromParcel(_reply);
       }
       else {
         _result = null;
       }
     }
     finally {
       _reply.recycle();
       _data.recycle();
     }
     return _result;
   }
   @Override public void SetBook(int id, java.lang.String name, double price) throws android.os.RemoteException
   {
     android.os.Parcel _data = android.os.Parcel.obtain();
     android.os.Parcel _reply = android.os.Parcel.obtain();
     try {
       _data.writeInterfaceToken(DESCRIPTOR);
       _data.writeInt(id);
       _data.writeString(name);
       _data.writeDouble(price);
       boolean _status = mRemote.transact(Stub.TRANSACTION_SetBook, _data, _reply, 0);
       if (!_status &amp;&amp; getDefaultImpl() != null) {
         getDefaultImpl().SetBook(id, name, price);
         return;
       }
       _reply.readException();
     }
     finally {
       _reply.recycle();
       _data.recycle();
     }
   }
   public static com.example.test.aidl.IBookManger sDefaultImpl;
 }
 static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
 static final int TRANSACTION_connect = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
 static final int TRANSACTION_disConnect = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
 static final int TRANSACTION_GetBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
 static final int TRANSACTION_SetBook = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
 public static boolean setDefaultImpl(com.example.test.aidl.IBookManger impl) {
   if (Stub.Proxy.sDefaultImpl == null &amp;&amp; impl != null) {
     Stub.Proxy.sDefaultImpl = impl;
     return true;
   }
   return false;
 }
 public static com.example.test.aidl.IBookManger getDefaultImpl() {
   return Stub.Proxy.sDefaultImpl;
 }
}
}
</code></pre></li>
<li>&#x9996;&#x5148;&#x901A;&#x8FC7; IMyAidlInterface.Stub.asInterface(IBinder obj )&#x8FD9;&#x65B9;&#x6CD5;&#x5F97;&#x5230;&#x7684;&#x63A5;&#x53E3;&#x65B9;&#x6CD5;&#xFF0C;&#x5728;&#x9996;&#x5148;&#x4F1A;&#x5224;&#x65AD;&#x8C03;&#x7528;&#x8005;&#x662F;&#x4E0D;&#x662F;&#x548C;obj&#x8FD9;&#x4E2A;&#x5B9E;&#x9645;&#x7684;Binder&#x7C7B;&#x4E3A;&#x540C;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#xFF0C;&#x662F;&#x7684;&#x8BDD;&#x4F1A;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;Binder&#x672C;&#x8EAB;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x4EE3;&#x7406;&#x7C7B;Proxy&#x3002;</li>
<li>&#x90A3;&#x4E48;&#x5B9E;&#x9645;&#x5728;&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x7684;&#x65F6;Proxy&#x7684;&#x76F8;&#x5E94;&#x65B9;&#x6CD5;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<pre><code>//&#x5728;&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x65B9;&#x6CD5;&#x65F6;&#x5B9E;&#x9645;&#x4F1A;&#x8C03;&#x7528;&#x5230;&#x8FD9;&#x91CC;
   @Override public com.example.test.aidl.Book GetBook() throws android.os.RemoteException
   {
     //&#x5C06;&#x8C03;&#x7528;&#x53C2;&#x6570;&#x5199;&#x5165;
     android.os.Parcel _data = android.os.Parcel.obtain();
     android.os.Parcel _reply = android.os.Parcel.obtain();
     com.example.test.aidl.Book _result;
     try {
       _data.writeInterfaceToken(DESCRIPTOR);
       //&#x8C03;&#x7528;Binder&#x7684;transact&#x65B9;&#x6CD5;&#x3001;&#x8FD4;&#x56DE;true&#x4EE3;&#x8868;&#x8C03;&#x7528;&#x6210;&#x529F;
       boolean _status = mRemote.transact(Stub.TRANSACTION_GetBook, _data, _reply, 0);
       if (!_status &amp;&amp; getDefaultImpl() != null) {
         //&#x8FD4;&#x56DE;&#x7ED3;&#x679C;
         return getDefaultImpl().GetBook();
       }
       _reply.readException();
       if ((0!=_reply.readInt())) {
         _result = com.example.test.aidl.Book.CREATOR.createFromParcel(_reply);
       }
       else {
         _result = null;
       }
     }
     finally {
       _reply.recycle();
       _data.recycle();
     }
     return _result;
   }
</code></pre>mRemot&#x8FD9;&#x4E2A;&#x53C2;&#x6570;&#x662F;&#x7531;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4F20;&#x5165;&#x7684;Binder&#x5BF9;&#x8C61;&#xFF0C;&#x5373;&#x662F;&#x6211;&#x4EEC;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x521B;&#x5EFA;&#x7684;Binder&#x5BF9;&#x8C61;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6700;&#x540E;&#x8C03;&#x7528;&#x4E86;&#x670D;&#x52A1;&#x7AEF;&#x521B;&#x5EFA;&#x7684;Binder&#x5BF9;&#x8C61;&#x7684;transact&#x65B9;&#x6CD5;&#xFF0C;&#x8BE5;&#x65B9;&#x6CD5;&#x5E95;&#x5C42;&#x5904;&#x7406;&#x540E;&#x4F1A;&#x8C03;&#x7528;onTransact
&#x65B9;&#x6CD5;&#xFF1A;<pre><code>@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
 {
   java.lang.String descriptor = DESCRIPTOR;
   switch (code)
   {
     case INTERFACE_TRANSACTION:
     {
       reply.writeString(descriptor);
       return true;
     }
    ...
     case TRANSACTION_GetBook:
     {
       data.enforceInterface(descriptor);
       com.example.test.aidl.Book _result = this.GetBook();
       reply.writeNoException();
       if ((_result!=null)) {
         reply.writeInt(1);
         _result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
       }
       else {
         reply.writeInt(0);
       }
       return true;
     }
    ...
   }
 }
</code></pre>&#x9996;&#x5148;&#x4F1A;&#x901A;&#x8FC7;code&#x5224;&#x65AD;&#x8C03;&#x7528;&#x662F;&#x54EA;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x7136;&#x540E;&#x8C03;&#x7528;&#x81EA;&#x8EAB;&#x7684;&#x5BF9;&#x5E94;&#x65B9;&#x6CD5;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5728;&#x670D;&#x52A1;&#x5668;&#x7AEF;Service&#x8FD4;&#x56DE;&#x7684;Binder&#x5B9E;&#x4F8B;,&#x56E0;&#x4E3A;stub&#x8FD9;&#x4E2A;&#x63A5;&#x53E3;&#x4E5F;&#x5B9E;&#x73B0;&#x5B9A;&#x4E49;&#x7684;&#x7ED9;&#x5BA2;&#x670D;&#x7AEF;&#x8C03;&#x7528;&#x7684;&#x63A5;&#x53E3;&#x65B9;&#x6CD5;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x65F6;&#x5176;&#x5B9E;&#x8C03;&#x7528;&#x7684;&#x5C31;&#x662F;&#x5728;&#x5B9E;&#x73B0;&#x65F6;&#x7684;&#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#xFF0C;&#x5C06;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x5199;&#x5165;&#x5230;reply&#x4E2D;&#xFF0C;&#x5E76;&#x8FD4;&#x56DE;true&#xFF0C;&#x8868;&#x793A;&#x8FDC;&#x7A0B;&#x8C03;&#x7528;&#x6210;&#x529F;&#xFF0C;&#x518D;&#x56DE;&#x5230;Proxy&#x7684;&#x76F8;&#x5E94;&#x65B9;&#x6CD5;&#x4E2D;&#xFF0C;&#x5728;transact&#x65B9;&#x6CD5;&#x8FD4;&#x56DE;true&#x540E;&#xFF0C;&#x4F1A;&#x8C03;&#x7528;_result = 
com.example.test.aidl.Book.CREATOR.createFromParcel(_reply)&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x4ECE;&#x5185;&#x5B58;&#x4E2D;&#x518D;&#x89E3;&#x6790;&#x51FA;&#x6765;&#x8FD4;&#x56DE;&#x7ED9;&#x8C03;&#x7528;&#x8005;&#x3002;</li>
</ol>
<h4 id="&#x603B;&#x7ED3;&#xFF1A;">&#x603B;&#x7ED3;&#xFF1A;</h4>
<ol>
<li>&#x8FDC;&#x7A0B;&#x8C03;&#x7528;asInterface&#x65B9;&#x6CD5;&#x65F6;&#x6839;&#x636E;&#x8FDB;&#x7A0B;&#x76F8;&#x540C;&#x8FD4;&#x56DE;&#x5B9E;&#x4F8B;&#xFF0C;&#x5426;&#x5219;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x4EE3;&#x7406;&#x7C7B;Proxy&#x3002;</li>
<li>&#x8BE5;&#x4EE3;&#x7406;&#x7C7B;&#x5728;&#x8C03;&#x7528;Binder&#x7684;transact&#x901A;&#x8FC7;&#x5E95;&#x5C42;&#x8C03;&#x7528;&#x5199;&#x5165;&#x5185;&#x5B58;&#x6570;&#x636E;&#xFF0C;&#x518D;&#x56DE;&#x8C03;onTransact&#x65B9;&#x6CD5;&#xFF0C;&#x89E3;&#x6790;&#x4F20;&#x5165;&#x53C2;&#x6570;&#x4ECE;data&#x4E2D;&#x83B7;&#x5F97;&#x7136;&#x540E;&#x8C03;&#x7528;&#x670D;&#x52A1;&#x5668;&#x672C;&#x5730;&#x7684;Binder&#x7684;&#x8BBE;&#x7F6E;&#x65B9;&#x6CD5;&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#xFF08;&#x5373;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x5B9E;&#x73B0;&#x7684;Binder&#x548C;IBookManger&#x7C7B;&#x5B9E;&#x4F8B;&#xFF09;&#xFF0C;&#x901A;&#x8FC7;&#x5411;reply&#x5199;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7;com.example.test.aidl.Book.CREATOR.createFromParcel(_reply)&#x89E3;&#x6790;&#x51FA;&#x6570;&#x636E;&#x4E4B;&#x540E;&#x8FD4;&#x56DE;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x7531;&#x4E8E;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x5E8F;&#x5217;&#x5316;&#x540E;&#x7684;&#x6570;&#x636E;&#x6240;&#x4EE5;&#x4E0D;&#x53D7;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x4F1A;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x901A;&#x8FC7;&#x5E8F;&#x5217;&#x5316;&#x65B9;&#x6CD5;&#x91CD;&#x65B0;&#x751F;&#x6210;&#x3002;&#x8BE5;&#x8FD4;&#x56DE;&#x7684;&#x5BF9;&#x8C61;&#x548C;&#x670D;&#x52A1;&#x7AEF;&#x5BF9;&#x8C61;&#x4E0D;&#x662F;&#x540C;&#x4E00;&#x4E2A;&#xFF0C;&#x53EA;&#x662F;&#x6570;&#x636E;&#x76F8;&#x540C;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x4F20;&#x53C2;&#x6570;&#x4E5F;&#x540C;&#x7406;&#x3002;</li>
<li>&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x65B9;&#x6CD5;&#x65F6;&#x5904;&#x4E8E;&#x5BA2;&#x6237;&#x7AEF;&#x8FDB;&#x7A0B;&#xFF0C;&#x76F4;&#x5230;&#x8C03;&#x7528;&#x4E86;transact&#x65B9;&#x6CD5;&#x4F1A;&#x5728;&#x5E95;&#x5C42;&#x5207;&#x6362;&#x5230;&#x670D;&#x52A1;&#x8FDB;&#x7A0B;&#x7684;onTransact&#x65B9;&#x6CD5;&#xFF0C;&#x518D;&#x8FD4;&#x56DE;&#x8C03;&#x7528;transact&#x8FD4;&#x56DE;&#x503C;&#x6210;&#x529F;&#x4E0E;&#x5426;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x8FDB;&#x7A0B;&#x3002;</li>
</ol>
<h3 id="&#x4F7F;&#x7528;messenger&#x5B9E;&#x73B0;binder&#xFF1A;">&#x4F7F;&#x7528;Messenger&#x5B9E;&#x73B0;Binder&#xFF1A;</h3>
<h5 id="1-&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;messenger-&#x7C7B;&#xFF0C;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x5904;&#x7406;&#x7684;handler&#x5E76;&#x5728;service&#x7684;onbind&#x65B9;&#x6CD5;&#x4E2D;&#x8C03;&#x7528;messenger&#x7684;getbinder&#x65B9;&#x6CD5;&#x56DE;&#x8C03;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x3002;">1. &#x5B9A;&#x4E49;&#x4E00;&#x4E2A;Messenger &#x7C7B;&#xFF0C;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x5904;&#x7406;&#x7684;handler,&#x5E76;&#x5728;Service&#x7684;onBind&#x65B9;&#x6CD5;&#x4E2D;&#x8C03;&#x7528;Messenger&#x7684;getBinder&#x65B9;&#x6CD5;&#x56DE;&#x8C03;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</h5>
<pre><code>public class MessengerTest extends Service {
    public final  static int MSG_FROM_CLIENT = 1;
    public final  static int MSG_FROM_SERVICE = 2;
    private static class MessengerHandler extends Handler{

        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what){
                //&#x6839;&#x636E;&#x83B7;&#x5F97;&#x7684;message&#x7684;what&#x5C5E;&#x6027;&#x5224;&#x65AD;&#x5BA2;&#x6237;&#x7AEF;&#x884C;&#x4E3A;
                case MSG_FROM_CLIENT:
                    Messenger messenger = msg.replyTo;
                    Message message = Message.obtain();
                    message.what = MSG_FROM_SERVICE;
                    message.replyTo = messenger;
                    try {
                        messenger.send(message);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }
    //&#x751F;&#x6210;&#x4E00;&#x4E2A;Messenger&#x5BF9;&#x8C61;&#xFF0C;&#x5904;&#x7406;&#x65B9;&#x6CD5;&#x4E3A;&#x4E0A;&#x9762;&#x7684;Handel
    private Messenger messenger = new Messenger(new MessengerHandler());
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //&#x8FD4;&#x56DE;Messenger&#x7684;Binder&#x5BF9;&#x8C61;
        return messenger.getBinder();
    }
}
</code></pre><p>&#x6700;&#x540E;&#x522B;&#x5FD8;&#x4E86;&#x6DFB;&#x52A0;&#x8FDB;&#x7A0B;&#x8C03;&#x7528;&#x5C5E;&#x6027;&#xFF1A;</p>
<pre><code> &lt;service android:name=&quot;.aidl.MessengerTest&quot;
            android:process=&quot;:remote&quot;
            android:exported=&quot;true&quot;/&gt;
</code></pre><h5 id="2&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;bindservice&#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x7684;binder&#x8F6C;&#x6362;&#x4E3A;messenger&#x5BF9;&#x8C61;&#xFF0C;&#x5411;&#x8FD9;&#x4E2A;messenger&#x4E2D;&#x53D1;&#x9001;&#x4FE1;&#x606F;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x5C31;&#x80FD;&#x6536;&#x5230;&#x6D88;&#x606F;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x4F20;&#x5165;message&#x7684;replyto&#x5C5E;&#x6027;&#x4F20;&#x5165;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7684;messenger&#x3002;">2.&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;bindService&#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x7684;Binder&#x8F6C;&#x6362;&#x4E3A;Messenger&#x5BF9;&#x8C61;&#xFF0C;&#x5411;&#x8FD9;&#x4E2A;Messenger&#x4E2D;&#x53D1;&#x9001;&#x4FE1;&#x606F;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x5C31;&#x80FD;&#x6536;&#x5230;&#x6D88;&#x606F;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x4F20;&#x5165;message&#x7684;replyto&#x5C5E;&#x6027;&#x4F20;&#x5165;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7684;Messenger&#x3002;</h5>
<pre><code>private Handler receviceHandler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
             //&#x5F53;&#x5411;&#x670D;&#x52A1;&#x7AEF;&#x53D1;&#x9001;&#x4FE1;&#x606F;&#x65F6;&#x4F20;&#x5165;replyto&#x5B57;&#x6BB5;&#x8BBE;&#x7F6E;&#x5F53;&#x524D;&#x5904;&#x7406;&#x7684;&#x7684;message&#x540E;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x53EF;&#x4EE5;&#x83B7;&#x5F97;&#x8BE5;messenger&#x53D1;&#x9001;&#x4FE1;&#x606F;&#x56DE;&#x8C03;&#x5230;&#x8FD9;&#x91CC;
            switch (msg.what) {
                case MSG_FROM_SERVICE:
                    break;
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    };
    private Messenger receviceMessenger = new Messenger(receviceHandler);
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //&#x83B7;&#x5F97;Binder&#x540E;&#x5305;&#x88C5;&#x6210;Messenger
            Messenger messenger = new Messenger(service);
            Message message = Message.obtain();
            //&#x8BBE;&#x7F6E;&#x53D1;&#x9001;&#x7684;code
            message.what = MSG_FROM_CLIENT;
            //&#x8BBE;&#x7F6E;&#x56DE;&#x8C03;&#x5904;&#x7406;&#x7684;messenger
            message.replyTo = receviceMessenger;
            try {
                messenger.send(message);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //&#x542F;&#x52A8;Service
        Intent intent = new Intent(this, MessengerTest.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    }
</code></pre><h3 id="&#x4F7F;&#x7528;remotecallbacklist&#x6CE8;&#x518C;&#x5BA2;&#x6237;&#x7AEF;&#x56DE;&#x8C03;&#xFF1A;">&#x4F7F;&#x7528;RemoteCallbackList&#x6CE8;&#x518C;&#x5BA2;&#x6237;&#x7AEF;&#x56DE;&#x8C03;&#xFF1A;</h3>
<p><strong>&#x5E73;&#x5E38;&#x5B9A;&#x4E49;&#x56DE;&#x8C03;&#x63A5;&#x53E3;&#x65F6;&#x901A;&#x8FC7;List&#x4FDD;&#x5B58;&#x5BA2;&#x6237;&#x7AEF;&#x56DE;&#x8C03;&#xFF0C;&#x8BE5;&#x56DE;&#x8C03;&#x5B9E;&#x73B0;aidl&#x5B9E;&#x73B0;&#xFF0C;Binder&#x8FDE;&#x63A5;&#x6C60;&#x4F1A;&#x4FDD;&#x5B58;&#x5BF9;&#x5E94;&#x7684;&#x6620;&#x5C04;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x8C03;&#x7528;&#x56DE;&#x8C03;&#x4E2D;&#x7684;&#x65B9;&#x6CD5;&#x65F6;&#x5B9E;&#x9645;&#x8981;&#x5148;&#x4ECE;Binder&#x4E2D;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x6620;&#x5C04;&#x518D;&#x8C03;&#x7528;&#x5B9E;&#x9645;&#x7684;&#x5BF9;&#x8C61;&#xFF08;&#x8FD9;&#x662F;&#x5728;Linux&#x5E95;&#x5C42;&#x5B9E;&#x73B0;&#x7684;&#xFF09;&#xFF0C;&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x670D;&#x52A1;&#x5668;&#x8C03;&#x7528;&#x5BA2;&#x6237;&#x7AEF;&#x56DE;&#x8C03;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x4E0B;&#x53D1;&#x901A;&#x77E5;&#xFF0C;&#x4F46;&#x7531;&#x4E8E;&#x670D;&#x52A1;&#x7AEF;&#x5E8F;&#x5217;&#x5316;&#x540E;&#x5F97;&#x51FA;&#x7684;&#x5BF9;&#x8C61;&#x662F;&#x4E0D;&#x540C;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x65E0;&#x6CD5;&#x5728;&#x4FDD;&#x5B58;&#x7684;&#x56DE;&#x8C03;&#x5217;&#x8868;&#x4E2D;&#x8C03;&#x7528;&#x89E3;&#x9664;&#x56DE;&#x8C03;&#x7684;&#x65B9;&#x6CD5;&#x5C06;&#x56DE;&#x8C03;&#x79FB;&#x9664;&#xFF0C;&#x8FD9;&#x65F6;&#x9700;&#x8981;&#x4F7F;&#x7528;RemoteCallbackList&#x6CE8;&#x518C;&#x3002;</strong></p>
<h5 id="&#x539F;&#x7406;&#xFF1A;&#x7531;&#x4E8E;&#x4F7F;&#x7528;&#x5BA2;&#x6237;&#x7AEF;&#x552F;&#x4E00;&#x4E0D;&#x53D8;&#x7684;&#x5C31;&#x662F;&#x8FDE;&#x63A5;&#x7684;binder&#xFF0C;&#x56E0;&#x6B64;remotecallbacklist&#x91C7;&#x7528;binder&#x4F5C;&#x4E3A;&#x952E;&#x503C;&#x4FDD;&#x5B58;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x4E5F;&#x610F;&#x5473;&#x7740;&#x4E00;&#x4E2A;binder&#x53EA;&#x80FD;&#x5BF9;&#x5E94;&#x4E00;&#x4E2A;&#x503C;&#x5BF9;&#x8C61;&#xFF0C;&#x56E0;&#x6B64;&#x6CE8;&#x518C;&#x7684;&#x56DE;&#x8C03;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x3002;">&#x539F;&#x7406;&#xFF1A;&#x7531;&#x4E8E;&#x4F7F;&#x7528;&#x5BA2;&#x6237;&#x7AEF;&#x552F;&#x4E00;&#x4E0D;&#x53D8;&#x7684;&#x5C31;&#x662F;&#x8FDE;&#x63A5;&#x7684;binder&#xFF0C;&#x56E0;&#x6B64;RemoteCallbackList&#x91C7;&#x7528;binder&#x4F5C;&#x4E3A;&#x952E;&#x503C;&#x4FDD;&#x5B58;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x4E5F;&#x610F;&#x5473;&#x7740;&#x4E00;&#x4E2A;binder&#x53EA;&#x80FD;&#x5BF9;&#x5E94;&#x4E00;&#x4E2A;&#x503C;&#x5BF9;&#x8C61;&#xFF0C;&#x56E0;&#x6B64;&#x6CE8;&#x518C;&#x7684;&#x56DE;&#x8C03;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x3002;</h5>
<h5 id="&#x5B9E;&#x73B0;">&#x5B9E;&#x73B0;:</h5>
<ol>
<li><p>&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x63A5;&#x53E3;&#x7C7B;aidl&#x6587;&#x4EF6;</p>
<pre><code> // IMListener.aidl
 package com.example.test.aidl;

 // Declare any non-default types here with import statements

 interface IMListener {
      void newMessage(in String str);
 }
</code></pre></li>
<li>&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;Service&#x670D;&#x52A1;&#x7AEF;&#x63A5;&#x53E3;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;:<pre><code> // IMManger.aidl
 package com.example.test.aidl;
 import com.example.test.aidl.IMListener;
 // Declare any non-default types here with import statements
 interface IMManger {
     void registerListener(IMListener listener);
     void unregisterListener(IMListener listener);
     void createNewMessage(String str);
 }
</code></pre>&#x6DFB;&#x52A0;&#x4E4B;&#x540E;&#x8981;&#x6DFB;&#x52A0;&#x8FDB;&#x7A0B;&#x9009;&#x9879;:<pre><code>  &lt;service android:name=&quot;.testListener.testService&quot;
             android:process=&quot;:remote&quot;
             android:exported=&quot;true&quot;/&gt;
</code></pre></li>
<li>Rebulid&#x4E00;&#x4E0B;&#x5DE5;&#x7A0B;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x7684;aidl&#x8F85;&#x52A9;&#x7C7B;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0A;&#x9762;&#x5DF2;&#x7ECF;&#x8BB2;&#x5230;&#x3002;</li>
<li><p>&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;Service&#x5B50;&#x7C7B;&#xFF1A;</p>
<pre><code> public class testService extends Service {

     //&#x4FDD;&#x5B58;&#x6240;&#x6709;&#x56DE;&#x8C03;&#x63A5;&#x53E3;&#x5217;&#x8868;
     private RemoteCallbackList&lt;IMListener&gt; imListeners = new RemoteCallbackList&lt;&gt;();

     private Binder imManger = new IMManger.Stub() {
         @Override
         public void registerListener(IMListener listener) {
             //&#x6DFB;&#x52A0;&#x4FDD;&#x5B58;&#x5BF9;&#x8C61;
             imListeners.register(listener);
         }

         @Override
         public void unregisterListener(IMListener listener) {
             //&#x89E3;&#x9664;&#x4FDD;&#x5B58;&#x5BF9;&#x8C61;
             imListeners.unregister(listener);
         }

         @Override
         public void createNewMessage(String str) throws RemoteException {
             //&#x904D;&#x5386;&#x5217;&#x8868;&#x8C03;&#x7528;&#x56DE;&#x8C03;&#x65B9;&#x6CD5;
             int n = imListeners.beginBroadcast();
             for (int i = 0; i &lt; n; i++) {
                 imListeners.getBroadcastItem(i).newMessage(str);
             }
             imListeners.finishBroadcast();
         }
     };

     @Nullable
     @Override
     public IBinder onBind(Intent intent) {
         return imManger;
     }
 }
</code></pre></li>
<li><p>&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#xFF1A;
```
 public class ListenerActivity extends AppCompatActivity implements View.OnClickListener {</p>
<pre><code> IMManger imManger;
 private IMListener listener = new IMListener.Stub() {

     @Override
     public void newMessage(String str) throws RemoteException {

         //&#x5728;&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x63A5;&#x6536;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#x56DE;&#x8C03;&#x540E;&#x7684;&#x6570;&#x636E;
         //&#x8FD9;&#x91CC;&#x4E0D;&#x662F;UI&#x7EBF;&#x7A0B;&#xFF0C;&#x56E0;&#x6B64;&#x8981;&#x60F3;&#x5237;&#x65B0;UI&#x9700;&#x8981;Handler
     }
 };
 private ServiceConnection serviceConnection = new ServiceConnection() {
     @Override
     public void onServiceConnected(ComponentName name, IBinder service) {

         //&#x83B7;&#x53D6;&#x8FDE;&#x63A5;Binder &#x8BE5;&#x503C;&#x662F;&#x7531;Service&#x7684;OnBind&#x8FD4;&#x56DE;&#x7684;&#x5B9E;&#x4F8B;
         imManger = IMManger.Stub.asInterface(service);

     }

     @Override
     public void onServiceDisconnected(ComponentName name) {
         imManger = null;
     }
 };
</code></pre></li>
</ol>
<pre><code>    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this

        //&#x542F;&#x52A8;&#x670D;&#x52A1;
        Intent intent = new Intent(this, testService.class);
        bindService(intent, serviceConnection, BIND_AUTO_CREATE);
    }


    int i = 0;

    @Override
    public void onClick(View v) {
        try {
            switch (v.getId()) {
                case R.id.button:

                     //&#x6CE8;&#x518C;&#x56DE;&#x8C03;
                    imManger.registerListener(listener);
                    break;
                case R.id.button2:
                    //&#x89E3;&#x9664;&#x56DE;&#x8C03;
                    imManger.unregisterListener(listener);
                    break;
                case R.id.button3:
                    //&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x6570;&#x636E;&#xFF0C;&#x8BE5;&#x6570;&#x636E;&#x4F1A;&#x88AB;&#x901A;&#x77E5;&#x5230;&#x670D;&#x52A1;&#x7AEF;&#x518D;&#x56DE;&#x8C03;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;
                    imManger.createNewMessage(&quot;123&quot; + i++);
                    break;

            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
</code></pre><pre><code>
### Binder&#x8FDE;&#x63A5;&#x6C60;&#xFF1A;
**&#x5728;&#x4F7F;&#x7528;AIDL&#x65F6;&#xFF0C;&#x6BCF;&#x6B21;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;AIDL&#x63A5;&#x53E3;&#x90FD;&#x9700;&#x8981;&#x4E00;&#x4E2A;Service&#x6765;&#x63D0;&#x4F9B;&#x670D;&#x52A1;&#xFF0C;&#x96BE;&#x4EE5;&#x7EF4;&#x62A4;&#xFF0C;&#x53EF;&#x4EE5;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x4E2D;&#x8F6C;&#x7684;AIDL&#x63A5;&#x53E3;&#xFF0C;&#x4E13;&#x95E8;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x5176;&#x4ED6;&#x63A5;&#x53E3;binder&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x53EB;&#x505A;binder&#x8FDE;&#x63A5;&#x6C60;&#x3002;**

##### &#x5B9E;&#x73B0;&#xFF1A;
1. &#x5B9E;&#x73B0;&#x4E00;&#x4E2A;BinderPool&#x63A5;&#x53E3;&#xFF0C;&#x5176;&#x4E2D;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x670D;&#x52A1;&#xFF1A;
</code></pre><pre><code> interface IBinderPool {
   IBinder queryBinder(int id);
} 
</code></pre><pre><code>2. &#x4E24;&#x4E2A;&#x63D0;&#x4F9B;&#x7684;&#x670D;&#x52A1;&#x63A5;&#x53E3;&#xFF1A;
</code></pre><pre><code>//&#x8BA1;&#x7B97;&#x52A0;&#x6CD5;&#x670D;&#x52A1;
interface IAddCompute {
    int add(int a,int b);
}
</code></pre><pre><code>```
    //&#x8BA1;&#x7B97;&#x51CF;&#x6CD5;&#x670D;&#x52A1;
    interface ISubCompute {
        int sub(int a,int b);
    }
</code></pre><ol>
<li><p>&#x5B9E;&#x73B0;&#x8FDE;&#x63A5;&#x6C60;&#x7684;Service&#xFF1A;</p>
<pre><code> public class BindPoolService extends Service {

     //&#x5B9A;&#x4E49;&#x4E0D;&#x540C;&#x7684;ID&#x533A;&#x5206;&#x4E0D;&#x540C;&#x7684;&#x8BF7;&#x6C42;&#x670D;&#x52A1;

     //&#x8BF7;&#x6C42;&#x52A0;&#x6CD5;&#x670D;&#x52A1;
     public final static int ADD_COMPUTE_SERVICE = 1;
     //&#x8BF7;&#x6C42;&#x51CF;&#x6CD5;&#x670D;&#x52A1;
     public final static int SUB_COMPUTE_SERVICE = 2;
     private Binder binderPool = new IBinderPool.Stub() {

         @Override
         public IBinder queryBinder(int id) throws RemoteException {
             //&#x6839;&#x636E;&#x4E0D;&#x540C;&#x7684;id&#x8FD4;&#x56DE;&#x4E0D;&#x540C;&#x7684;bind&#x5B9E;&#x4F8B;
             switch (id) {
                 case ADD_COMPUTE_SERVICE:
                     return new IAddCompute.Stub() {
                         @Override
                         public int add(int a, int b) throws RemoteException {
                             return a + b;
                         }
                     };
                 case SUB_COMPUTE_SERVICE:
                     return new ISubCompute.Stub() {
                         @Override
                         public int sub(int a, int b) throws RemoteException {
                             return a - b;
                         }
                     };
                 default:
                     return null;
             }
         }
     };

     @Nullable
     @Override
     public IBinder onBind(Intent intent) {
         return binderPool;
     }
 }
</code></pre><p>&#x522B;&#x5FD8;&#x4E86;&#x8981;&#x8BBE;&#x7F6E;&#x8FDB;&#x7A0B;&#x53C2;&#x6570;&#x548C;&#x5916;&#x90E8;&#x8C03;&#x7528;</p>
</li>
<li><p>&#x5BA2;&#x6237;&#x7AEF;&#x8C03;&#x7528;&#xFF1A;</p>
<pre><code> public class BindPoolAty extends AppCompatActivity implements View.OnClickListener {
     IBinderPool bindPoolService;
     ServiceConnection serviceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             bindPoolService = IBinderPool.Stub.asInterface(service);
         }

         @Override
         public void onServiceDisconnected(ComponentName name) {

         }
     };

     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         Intent intent = new Intent(this, BindPoolService.class);
         bindService(intent, serviceConnection, BIND_AUTO_CREATE);

         findViewById(R.id.button).setOnClickListener(this);
         findViewById(R.id.button2).setOnClickListener(this);

     }

     @Override
     public void onClick(View v) {
         switch (v.getId()){
             case R.id.button:
                 //&#x83B7;&#x5F97;&#x52A0;&#x6CD5;&#x670D;&#x52A1;
                 try {
                     IAddCompute addComputeService = IAddCompute.Stub.asInterface( bindPoolService.queryBinder(ADD_COMPUTE_SERVICE));
                     Log.i(&quot;tag&quot;, &quot;&quot; + addComputeService.add(1, 2));
                 } catch (RemoteException e) {
                     e.printStackTrace();
                 }
                 break;
             case R.id.button2:
                 //&#x83B7;&#x5F97;&#x51CF;&#x6CD5;&#x670D;&#x52A1;
                 try {
                     ISubCompute subComputeService = ISubCompute.Stub.asInterface( bindPoolService.queryBinder(SUB_COMPUTE_SERVICE));
                     Log.i(&quot;tag&quot;, &quot;&quot; + subComputeService.sub(8, 2));
                 } catch (RemoteException e) {
                     e.printStackTrace();
                 }
                 break;
         }
     }
 }
</code></pre><p>&#x524D;&#x9762;&#x90FD;&#x662F;&#x6B63;&#x5E38;&#x4F7F;&#x7528;&#xFF0C;&#x76F4;&#x5230;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x771F;&#x6B63;&#x7684;&#x670D;&#x52A1;&#x65F6;&#x8C03;&#x7528;IBindPool&#x7684;Binder&#x7C7B;&#x7684;queryBinder&#x8FD4;&#x56DE;&#x4E0D;&#x540C;&#x7684;&#x5B9E;&#x4F8B;&#x5E76;&#x8F6C;&#x5316;&#x4E3A;&#x63A5;&#x53E3;&#x8C03;&#x7528;&#x3002;</p>
</li>
</ol>

                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                
                <a href="Dialog源码.html" class="navigation navigation-next navigation-unique" aria-label="Next page: Dialog源码">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"layout":"post","title":"Binder","subtitle":" 使用AIDL实现原理","date":"2020-02-16T23:14:00.000Z","author":"hzy","//header-img":"img/post-bg-2015.jpg","catalog":true,"tags":["Binder"],"level":"1.2.2.1","depth":3,"next":{"title":"Dialog源码","level":"1.2.2.2","depth":3,"path":"android/源码/Dialog源码.md","ref":"android/源码/Dialog源码.md","articles":[]},"previous":{"title":"源码解析","level":"1.2.2","depth":2,"ref":"","articles":[{"title":"Binder","level":"1.2.2.1","depth":3,"path":"android/源码/Binder.md","ref":"android/源码/Binder.md","articles":[]},{"title":"Dialog源码","level":"1.2.2.2","depth":3,"path":"android/源码/Dialog源码.md","ref":"android/源码/Dialog源码.md","articles":[]},{"title":"RecycleView缓存机制","level":"1.2.2.3","depth":3,"path":"android/源码/RecycleView缓存机制.md","ref":"android/源码/RecycleView缓存机制.md","articles":[]},{"title":"WMS源码","level":"1.2.2.4","depth":3,"path":"android/源码/WMS源码.md","ref":"android/源码/WMS源码.md","articles":[]}]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":["livereload"],"pluginsConfig":{"livereload":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"android/源码/Binder.md","mtime":"2020-08-16T16:20:47.000Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2021-03-13T16:08:39.790Z"},"basePath":"../..","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="../../gitbook/gitbook.js"></script>
    <script src="../../gitbook/theme.js"></script>
    
        
        <script src="../../gitbook/gitbook-plugin-livereload/plugin.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>

